package com.eam.asset.file.service.impl;

import java.util.Arrays;
import java.util.List;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eam.asset.file.dto.AssetLand.AssetLandAddDto;
import com.eam.asset.file.dto.AssetLand.AssetLandDto;
import com.eam.asset.file.utils.AssetEncode;
import com.eam.common.constant.Constants;
import com.eam.common.core.redis.SRTemplateCache;
import com.eam.common.utils.DateUtils;
import com.eam.common.utils.SecurityUtils;
import com.eam.common.utils.bean.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.eam.asset.file.mapper.AssetLandMapper;
import com.eam.asset.file.domain.AssetLand;
import com.eam.asset.file.service.IAssetLandService;

import static com.eam.asset.file.Enum.AssetEncodeEnum.ASSETLAND;

/**
 * 土地资产档案Service业务层处理
 *
 * @author tzf
 * @date 2023-10-31
 */
@Service
public class AssetLandServiceImpl extends ServiceImpl<AssetLandMapper, AssetLand> implements IAssetLandService {
    private final SRTemplateCache SRTemplateCache;


    //构造器注入
    @Autowired
    public AssetLandServiceImpl(SRTemplateCache srTemplateCache) {
        SRTemplateCache = srTemplateCache;
    }

    /**
     * 查询土地资产档案
     *
     * @param landId 土地资产档案主键
     * @return 土地资产档案
     */
    @Override
    public AssetLand selectAssetLandByLandId(String landId) {
        //如果存在key,从redis中取值
        if (SRTemplateCache.hasKey(landId)) {
            return SRTemplateCache.get(landId, AssetLandDto.class);
        }
        AssetLand assetLand = baseMapper.selectById(landId);
        AssetLandDto assetLandDto = new AssetLandDto();
        BeanUtils.copyProperties(assetLand, assetLandDto);
        //存进redis
        SRTemplateCache.set(landId, JSONUtil.toJsonStr(assetLandDto));
        return assetLandDto;
    }

    /**
     * 查询土地资产档案列表
     *
     * @param assetLand 土地资产档案
     * @return 土地资产档案
     */
    @Override
    public List<AssetLand> selectAssetLandList(AssetLand assetLand) {
        //todo 后续做redis缓存,考虑数据一致性,如增删改操作需要考虑
        AssetLandDto assetLandDto = new AssetLandDto();
        //深拷贝
        BeanUtils.copyProperties(assetLand, assetLandDto);

        return baseMapper.selectAssetLandList(assetLandDto);
    }

    /**
     * 新增土地资产档案
     *
     * @param assetLand 土地资产档案
     * @return 结果
     */
    @Override
    public int insertAssetLand(AssetLand assetLand) {
        //创建dto对象,深拷贝属性值
        AssetLandAddDto assetLandAddDto = new AssetLandAddDto();
        BeanUtils.copyProperties(assetLand, assetLandAddDto);
        //设置基本的信息
        assetLandAddDto.setCreateBy(AssetEncode.IfAbsent(SecurityUtils.getUserId()));
        assetLandAddDto.setCreateTime(DateUtils.getNowDate());
        assetLandAddDto.setStatus(Constants.ZERO);
        //设置资产档案编号,一级资产分类编码+二级资产分类编码+三级资产名称编码加编号
        StringBuffer encode = AssetEncode.getEncode(ASSETLAND.getType()).
                append(AssetEncode.getEncode(assetLandAddDto.getLandCategory())).
                append(AssetEncode.getEncodeByName(assetLandAddDto.getLandName())).
                append(DateUtils.dateTime());
        assetLandAddDto.setLandCode(encode.toString());
        return baseMapper.insert(assetLandAddDto);
    }

    /**
     * 修改土地资产档案
     *
     * @param assetLand 土地资产档案
     * @return 结果
     */
    @Override
    public int updateAssetLand(AssetLand assetLand) {
        assetLand.setUpdateTime(DateUtils.getNowDate());
        assetLand.setUpdateBy(AssetEncode.IfAbsent(SecurityUtils.getUserId()));
        AssetLandDto assetLandDto = new AssetLandDto();
        BeanUtils.copyProperties(assetLand, assetLandDto);
        return baseMapper.updateById(assetLandDto);
    }

    /**
     * 批量删除土地资产档案
     *
     * @param landIds 需要删除的土地资产档案主键
     * @return 结果
     */
    @Override
    public int deleteAssetLandByLandIds(String[] landIds) {
        return baseMapper.deleteBatchIds(Arrays.asList(landIds));
    }

    /**
     * 删除土地资产档案信息
     *
     * @param landId 土地资产档案主键
     * @return 结果
     */
    @Override
    public int deleteAssetLandByLandId(String landId) {
        return baseMapper.deleteById(landId);
    }
}
